##################Python中的列表###############

# 一 列表的创建############

lst=['祝涛','is','yyds']  #lst 就是一个列表对象

print(type(lst),id(lst)) #程序会输出 class<'list'> + 一串id号

print(lst)  #程序会输出  ['祝涛','is','yyds']

'''
创建列表有两种方式
  1. 使用中括号[]        ： lst1=['一','二','三']
  2. 使用内置函数 list() ： lst2=list(['一','二','三'])
'''

# 二 列表的特点############

'''
    1.有序排序
    2.支持索引随机查找  *需要注意的是，下标为负数时索引到的是列表中倒数第几个，倒数第一个就是-1，倒数第二个就是-2以此类推，但是没有-0
    3.数据类型可以混合
    4.可以存储重复数据
    5.可以动态分配或者回收内存  

'''

# 三 列表的查询###############
print()
# (一) index()函数
'''
1.当列表存在多个相同元素时，只返回第一个元素的索引
2.可以用lst.index('要查找的元素',start,stop) 查找 表示在索引 start 到stop-1查找目标
'''

print('列表lst的第一个元素是     ',lst[0],'\n''列表lst的倒数第一个元素是 ',lst[-1])
print('列表中元素 祝涛 的索引是  ',lst.index('祝涛',0,2))
print()
# （二）切片查询
print('-----------切片------------------')
lst2=list(['in','code','we','trust','forever','666'])
print('原列表是  ',lst2)
print('切片列表是',lst2[1:4:2])  #lst2[start:stop:step] start默认为0，step默认为1  所以 lst2[::-1] 就是倒叙输出
print('上述切片是起始为1，终止到4，步长为2 的切片拷贝列表')
print()
print('--------------倒序输出------------------------')
print(lst2[::-1])

print()
# (三) for-in遍历

for i in lst2:
    print(i)  # 类似于循环遍历

print()

# 四 列表的添加与删除#############

# （一）列表的添加

    #1.尾部添加 --append() 与 extend()
print('--------尾部添加----------------------')
print('添加前列表lst2的元素是 ' ,lst2)
lst2.append(777)  #append()函数向列表尾部添加*一个*元素
print('添加后列表lst2的样子',lst2)
print()
lst2.append(lst)
print('用append函数添加lst到lst2尾部的结果为',lst2)
lst2.extend(lst)  #extend()函数是向列表尾部添加*至少一个*元素
print('用extend函数继续向列表尾部添加lst的结果为',lst2)
print()
print('可见 append函数是将lst作为一个元素插入lst2中，而extend函数是将lst展开插入')
print()
    #2.随意插入---insert()函数与切片
print('-----------insert()函数--------------')
print('插入前lst3的样子是')
lst3=['1','3','4','5','6']
print(lst3)
lst3.insert(1,'2')  #在列表的任意位置插入*一个*元素  格式：lst.insert(角标，元素)
print('插入后lst3的样子是`')
print(lst3)
print()

print('----------切片删除------------------------')
print('lst3的样子是')
print(lst3)
print('lst2的样子是')
print(lst2)
lst3[1:]=lst2   #在lst3 的角标为1后面的元素全部替换成lst2的元素`
print('执行 lst3[1:]=lst2后，lst3的样子是')
print(lst3)

# (二) 列表的删除
lst.clear()
lst=[10,20,30,40,50,60]
print('lst原来的样子',lst)
print()
lst.remove(30)  #如果有重复元素，只会移除第一个，如果移除元素不存在会抛出错误
print('用remove()移除 30 后',lst)
print()
print('用pop(0)之前',lst)
lst.pop(0) #移除索引为 0 的元素  如果pop（）括号内没有参数，默认将会移除最后一个元素
print()
print('用pop(0)之后lst',lst)
print()
print('-------------切片操作-删除至少一个元素，将会产生新的列表----------')
print()
lst.clear()
lst=[1,2,3,4,5,6]
print('原列表',lst)
new_lst=lst[1:3]  #将lst中角标为1到角标为3-1的元素切片到new_lst形成全新的列表`
print('切片产生的new_lst',new_lst)
'''
如果不想产生新的列表，切片操作也可以实现
    即 lst[1:3]=[] 
    用[]空列表来替代lst中角标1到2的部分

'''
print(lst)
lst[1:3]=[]
print(lst)

del lst  #del 将会直接删除列表元素


# 五 列表的修改##########################################
print('-----------------列表的修改-----------------')
'''

可以直接用脚标修改
'''
lst=[1,2,3,4,5,6,7]
print(lst)
lst[1]=100 #脚标为1 的元素会直接变成100
print(lst)

lst[1:3]=[20,30,40,50] #将列表中脚标为 1 到3的所有部分直接替换为后面中括号内的部分，数量不用匹配
print(lst)
del lst
# 六 列表的排序########################################
'''
sort()

或者内置函数

sorted()
'''
lst=[2,9,8,1,77,39,83]
#1.sort() 函数
print('---------列表的排序----------------')
print('原列表',lst)
print(id(lst))
lst.sort() #如果不指定参数 默认为 reverse=False 是升序排序
print('排序后',lst)
lst.sort(reverse=True) #降序排序
print(lst)
print(id(lst))  #因为排序前后ID没有改变 所以sort（）函数是在原列表的基础上排序的，并没有产生新的列表

#2.sorted()函数
del lst
lst=[6,99,1,0,8,33,56]
print(lst)
new_lst=sorted(lst) #不给第二个参数的话，默认是升序排列
print(new_lst)

new_lst=sorted(lst,reverse=True)
print(new_lst)
'''
显然，用sorted()是产生一个新的列表
'''
# 七 列表生成式#######################################
'''
[f(i) for i in range(a,b)]

f(i) : 关于 i 的表达式，实际上在列表中存储的是 f(i) 的值
[] : 表示生成的是列表

for i in range(a,b)  : for-in 表达式 
'''
print('---------------列表生成式-------------------')
del lst
lst=[i*i for i in range(1,6)]  #在这里 f(i)=i*i, 生成的是 1，4，9，16，25 
print(lst)

